home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 176-200 / 190 / nethack / twee.zoo / write.c < prev    next >
C/C++ Source or Header  |  1988-06-28  |  4KB  |  174 lines

  1. /*    SCCS Id: @(#)write.c    2.0    87/09/16
  2.  */
  3.  
  4. #include "hack.h"
  5.  
  6. extern char pl_character[];
  7.  
  8. #ifdef MARKER
  9.  
  10. /*
  11.  * returns basecost of a scroll
  12.  */
  13. int
  14. cost(scroll)
  15. register struct obj *scroll;
  16. {
  17.     switch(scroll->otyp)  {
  18. # ifdef MAIL
  19.     case SCR_MAIL:
  20.     return(0);
  21.     break;
  22. # endif
  23.     case SCR_LIGHT:
  24.     case SCR_GOLD_DETECTION:
  25.     case SCR_FOOD_DETECTION:
  26.     case SCR_MAGIC_MAPPING:
  27.     case SCR_AMNESIA:
  28.     case SCR_FIRE:
  29.     return(8);
  30.     break;
  31.     case SCR_DESTROY_ARMOR:
  32.     case SCR_DAMAGE_WEAPON:
  33.     case SCR_CREATE_MONSTER:
  34.     case SCR_PUNISHMENT:
  35.     return(10);
  36.     break;
  37.     case SCR_CONFUSE_MONSTER:
  38.     return(12);
  39.     break;
  40.     case SCR_IDENTIFY:
  41.     return(14);
  42.     break;
  43.     case SCR_ENCHANT_ARMOR:
  44.     case SCR_REMOVE_CURSE:
  45.     case SCR_ENCHANT_WEAPON:
  46.     return(16);
  47.     break;
  48.     case SCR_SCARE_MONSTER:
  49.     case SCR_TAMING:
  50.     case SCR_TELEPORTATION:
  51.     return(20);
  52.     break;
  53.     case SCR_GENOCIDE:
  54.     return(30);
  55.     break;
  56.     case SCR_BLANK_PAPER:
  57.     default:
  58.     impossible("You can't write such a weird scroll!");
  59.     }
  60.     return(1000);
  61. }
  62.  
  63.  
  64. dowrite(pen)
  65.     register struct obj *pen;
  66. {
  67.     register struct obj *paper;
  68.     char namebuf[BUFSZ], scrbuf[BUFSZ];
  69.     register struct obj *newscroll;
  70.     extern struct obj *readobjnam(), *addinv();
  71.     int basecost, actualcost;
  72.     int newquan;
  73.  
  74.     if(!pen)
  75.     return(0);
  76.     if(pen->otyp != MAGIC_MARKER)  {
  77.     pline("You can't write with that!");
  78.     return(0);
  79.     }
  80.  
  81.     /* get paper to write on */
  82.     paper = getobj("?","write on");
  83.     if(!paper)
  84.     return(0);
  85.     if(!(objects[paper->otyp].oc_name_known))  {
  86.     pline("In your haste, you rip the scroll to pieces.");
  87.     useup(paper);
  88.     return(1);
  89.     }
  90. # ifndef KAA
  91. /* If this is included, the strategy would be to name all scrolls so that
  92.  * you can test them for blankness with a magic marker.  This is tedious,
  93.  * thus, let's make it easier. */
  94.     if(!(objects[paper->otyp].oc_name_known))  {
  95.     pline("In your haste, you rip the scroll to pieces.");
  96.     useup(paper);
  97.     return(0);
  98.     }
  99. # endif
  100.     if(paper->otyp != SCR_BLANK_PAPER)  {
  101.     pline("You fool, that scroll's not blank!");
  102.     return(0);
  103.     }
  104.  
  105.     /* what to write */
  106.     pline("What do you want to write? ");
  107.     getlin(namebuf);
  108.     if(namebuf[0] == '\033' || !namebuf[0])
  109.     return(0);
  110.     strcpy(scrbuf,"scroll of ");
  111.     strcat(scrbuf,namebuf);
  112.     newscroll = readobjnam(scrbuf);
  113.     if(newscroll->olet != SCROLL_SYM ||
  114.        newscroll->otyp == SCR_BLANK_PAPER)  {
  115.     pline("You can't write that!");
  116.     pline("It's obscene!");
  117.     return(0);
  118.     }
  119.  
  120.     /* see if there's enough ink */
  121.     basecost = cost(newscroll);
  122.     if(pen->spe < basecost/2)  {
  123.     pline("You marker is too dried out to write that!");
  124.     obfree(newscroll, (struct obj *) 0);
  125.     return(0);
  126.     }
  127.  
  128.     /* we're really going to write now, so calculate
  129.      * cost and useup old scroll
  130.      */
  131.     actualcost = rn1(basecost/2,basecost/2);
  132.     useup(paper);
  133.  
  134.     /* dry out marker */
  135.     if(pen->spe < actualcost)  {
  136.     pline("Your marker dries out!");
  137.     pline("The scroll is now useless and disappears!");
  138.     pen->spe = 0;
  139.     obfree(newscroll, (struct obj *) 0);
  140.     return(1);
  141.     }
  142.     pen->spe -= actualcost;
  143. # ifdef KAA /* Since the KAA modification allows writing on unknown blank
  144.     paper, identify blank paper. */
  145.     objects[SCR_BLANK_PAPER].oc_name_known=1;
  146. # endif
  147.  
  148.     /* can't write if we don't know it - unless we're lucky */
  149.     if(!(objects[newscroll->otyp].oc_name_known) &&
  150. # ifdef KAA
  151.        !(objects[newscroll->otyp].oc_uname) &&
  152. # endif
  153.        ((pl_character[0] == 'W' && rn2(3)) ||
  154.     (pl_character[0] != 'W' && rn2(10))))  {
  155.     pline("You don't know how to write that!");
  156.     pline("You write \"Shah was here!\" and the scroll disappears.");
  157.     obfree(newscroll, (struct obj *) 0);
  158.     return(1);
  159.     }
  160.  
  161.     /* and now you know it! */
  162.     objects[newscroll->otyp].oc_name_known = 1;
  163.  
  164.     /* success - don't forget to fool prinv() */
  165.     newscroll = addinv(newscroll);
  166.     newquan = newscroll->quan;
  167.     newscroll->quan = 1;
  168.     prinv(newscroll);
  169.     newscroll->quan = newquan;
  170.  
  171.     return(1);
  172. }
  173. # endif /* MARKER /**/
  174.